#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Attributes:
    __version__ (str): "0.0.1"
    __copyright__ (str): "Copyright (C) 2025 z"
    __license__ (str): "MIT"
    __author__ (str): "Z"
"""

import logging
import datetime
from logging.handlers import RotatingFileHandler

from config.system import LOG_LEVEL, LOG_BAK, LOG_MAX, LOG_PATH


class CustomLogger:
    """日志处理"""
    def __init__(self):
        """
        DEBUG 用于详细的调试信息。
        INFO 用于确认程序按预期工作。
        WARNING 用于表示可能的问题,但程序仍然可以继续运行。
        ERROR 用于表示出现了错误,导致程序无法完成某些操作。
        CRITICAL 用于表示严重的错误,可能导致程序崩溃。
        这些级别按照严重程度依次递增,即 DEBUG < INFO < WARNING < ERROR < CRITICAL。当设置了某个级别时,只有该级别及以上级别的日志消息才会被记录。
        例如,如果将日志记录器的级别设置为 INFO,那么只有 INFO、WARNING、ERROR 和 CRITICAL 级别的消息会被记录,而 DEBUG 级别的消息则不会被记录。
        """

        # 日志记录器名称
        self._logger = logging.getLogger("app")
        # 设置日志级别
        log_level = getattr(logging, LOG_LEVEL)
        self._logger.setLevel(log_level)
        self.current_date = datetime.date.today().strftime("%Y_%m_%d")

        # 创建一个控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setLevel(log_level)  # 设置控制台处理器的日志级别

        # 设置日志格式
        formatter = logging.Formatter('{"timestamp": "%(asctime)s", "level": "%(levelname)s", %(message)s}')
        # 创建一个格式化器并将其添加到处理器
        console_handler.setFormatter(formatter)

        # 创建错误日志处理器 单独记录ERROR级别及以上的日志
        error_handler = RotatingFileHandler(
            LOG_PATH + "/app_error-" + self.current_date + '.log',
            mode='a',
            maxBytes=LOG_MAX,
            backupCount=LOG_BAK
        )
        error_handler.setLevel(logging.ERROR)  # 只记录ERROR级别及以上的日志
        error_handler.setFormatter(formatter)

        # 创建文件处理器并将日志写入到指定的日志文件中
        file_handler = RotatingFileHandler(LOG_PATH + "/app-" + self.current_date + '.log', mode='a', maxBytes=LOG_MAX, backupCount=LOG_BAK)
        # file_handler = logging.FileHandler("app.log")
        file_handler.setLevel(log_level)
        file_handler.setFormatter(formatter)

        # 添加文件处理器到日志记录器中 记录到.log文件
        self._logger.addHandler(file_handler)
        # 将处理器添加到日志记录器 屏显
        self._logger.addHandler(console_handler)
        # 添加错误日志处理器
        self._logger.addHandler(error_handler)

    def __generate_error_response(self, code: int, message: str, function: str) -> dict:
        """生成标准化错误响应"""
        return f'"code": "{code}", "message": "{message}", "function": "{function}"'

    # def debug(self, msg, *args, **kwargs):
    #     # 直接将所有参数拼接成字符串
    #     full_msg = str(msg)
    #     if args:
    #         full_msg += ' ' + ' '.join(map(str, args))
    #     self._logger.debug(full_msg, **kwargs)
    def debug(self, msg, *args, **kwargs):
        """重写debug方法，使用标准化错误响应"""
        message = args[0] if args else ""
        function = args[1] if args else ""
        error_response = self.__generate_error_response(msg, message, function)
        self._logger.debug(error_response, **kwargs)

    def info(self, msg, *args, **kwargs):
        """重写info方法，使用标准化错误响应"""
        message = args[0] if args else ""
        function = args[1] if args else ""
        error_response = self.__generate_error_response(msg, message, function)
        self._logger.info(error_response, **kwargs)

    def warning(self, msg, *args, **kwargs):
        """重写warning方法，使用标准化错误响应"""
        message = args[0] if args else ""
        function = args[1] if args else ""
        error_response = self.__generate_error_response(msg, message, function)
        self._logger.warning(error_response, **kwargs)

    def error(self, msg, *args, **kwargs):
        """重写error方法，使用标准化错误响应"""
        message = args[0] if args else ""
        function = args[1] if args else ""
        error_response = self.__generate_error_response(msg, message, function)
        self._logger.error(error_response, **kwargs)

    def critical(self, msg, *args, **kwargs):
        """重写critical方法，使用标准化错误响应"""
        message = args[0] if args else ""
        function = args[1] if args else ""
        error_response = self.__generate_error_response(msg, message, function)
        self._logger.critical(error_response, **kwargs)

    @property
    def logger(self):
        return self._logger


if __name__ == '__main__':
    logger = CustomLogger()
    logger.debug(30004, "message", __name__)
